from camel.agents import ChatAgent
from camel.models import ModelFactory
from camel.types import ModelPlatformType
from camel.societies.workforce import Workforce
from camel.toolkits import SearchToolkit
from camel.tasks import Task
from camel.toolkits import FunctionTool
import os
from dotenv import load_dotenv

load_dotenv()

Model_Type=os.getenv("MODEL_TYPE")
Model_Api=os.getenv("ZHIPU_API_KEY")
Model_Url=os.getenv("MODEL_URL")
model = ModelFactory.create(
    model_platform=ModelPlatformType.OPENAI,
    model_type=Model_Type,
    api_key=Model_Api,
    url=Model_Url
)
#创建workforce，先创建协调智能体(coordinator Agent)和任务规划智能体(Task Planner Agent)
#跟普通智能体创建的过程一样
coordinator = ChatAgent(
    model=model,
    system_message="你是一个协调任务的智能体，负责拆解任务并协调执行，输出使用中文",
    output_language='zh-cn'
)
task_agent =ChatAgent(
    model=model,
    system_message='你负责任务的规划和分解，将复杂的任务拆解为可执行的子任务，输出使用中文',
    output_language='zh-cn',
)

#创建workforce，填入必要的智能体参数（协调＆任务）
workforce = Workforce(
    #description
    '减肥计划制定评估小组',
    coordinator_agent=coordinator,
    task_agent=task_agent,
)

#创建workforce之后，需要创建工作节点来具体执行任务
#1.产出计划的智能体   2.对计划的可行性及有效性的评估的智能体    3.有丰富减肥经验的执行计划的用户的智能体
plan_make_agent = ChatAgent(
    model=model,
    system_message='你是一个减肥领域的专家，能针对不同体质，身体状况来制定有效的，合理的减肥计划',
    output_language='zh-cn',
)
plan_assess_agent = ChatAgent(
    model=model,
    system_message='你擅长评估用户的运动方案的合理性和有效性，并给出评价',
    output_language='zh-cn',

)
#假如给用户agent添加一个工具     ------search_duckduckgo尝试多次，本地or代理，均因访问速率限制，无法得到预期结果
# search_tool = FunctionTool(SearchToolkit().search_duckduckgo)
plan_user_agent = ChatAgent(
    model=model,
    system_message='你有丰富的减肥经验，曾经尝试过多种方案，深刻体会到了各种方案的具体效果，能针对方案，给出用户视角的评价和建议',
    output_language='zh-cn',
    # tools=[search_tool]
)

#工作节点创建完毕，将工作节点加入工作链(链式添加)
workforce.add_single_agent_worker(
    #添加智能体的工作描述
    '制定减肥计划的智能体，输出使用中文',
    worker=plan_make_agent,
).add_single_agent_worker(
    '评估减肥计划的智能体，输出使用中文',
    worker=plan_assess_agent
).add_single_agent_worker(
    '以用户视角对减肥计划进行评价和改善建议，输出使用中文',
    worker=plan_user_agent,
)


#workforce制定完毕,创建个简单任务进行测试

task = Task(
    content='制定一个针对于身高172cm，体重75kg的23岁的男性，想要四个月之内减肥到60-65kg的减肥计划,语言使用中文',
    #id可以为任意————字符串————
    id='0'
)

#用workforce处理任务
task = workforce.process_task(task)


#输出结果
print(task.result)



